﻿/*
 * Util.h
 *
 *  Created on: 2013. 7. 29.
 *      Author: ncanis
 */
#pragma once

#include "Stdafx.h"

namespace TED {

// 주어진 포인터를 제거한다.
struct ted_delete {
	// 초기화 될때 전달된 포인터의 메모리를 제거한다.
	template<typename T> void operator()(T*& p) const {
		T* tmp = NULL;
		swap(p, tmp);
		delete tmp;
	}
};

/**
	@author ncanis
	@brief 라이브러리 모음
*/
class Util {
public:
	// 주어진 에러코드에 대한 메세지를 가져온다.
	static void GetMessage(INT32 errorCode, TCHAR* msg) {
		// MAKELANGID :usPrimaryLanguage, usSubLanguage를 통해 언어식별자를 WORD형으로 가져온다.
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL);
	}

	// 멀티바이트 인자 f를 받아 처리한다.
	static DWORD ted_inet_addr(const TCHAR *tc)
	{
	#ifdef UNICODE
		char ip[16];
		int result = WideCharToMultiByte(CP_ACP, 0, tc, _tcslen(tc), ip, 15, NULL, NULL);
		ip[result] = 0;
		return inet_addr(ip);
	#else
		return inet_addr(tc);
	#endif
	}

	// 주소값에서 ip를 TCHAR로 복사해 가져온다.
	static void ted_inet_ntoa(const SOCKADDR_IN& address, TCHAR* ip)
	{		
#ifdef UNICODE
		char* sip = inet_ntoa(address.sin_addr);
		MultiByteToWideChar(CP_ACP, 0, sip, strlen(sip), ip, 15);
#else
		ip = inet_ntoa(address.sin_addr);
#endif
	}

	// 주어진 데이터의 hexa 값을 출력한다.
	template <class T> static void ToHex(TCHAR* desc, INT32 start, INT32 length,T* const src) {		
		INT32 i=0;
		INT32 pos =0;
		INT32 h_len = 3; //헥사 표시 공간(3자리)
		for (i=0; i<length; i++) {		
			if(pos>length) break;

			// 주어진 크기만큼 복사한다.
			_stprintf_s(desc+pos, h_len*sizeof(TCHAR), _T("%02x "), src[i]);

			pos+=h_len;		
		}	
	}
};

// 동기화
class CriticalSectionManager {
private:
	CRITICAL_SECTION lock;
public:
	CriticalSectionManager() {
		InitializeCriticalSection (&lock);
	}
	~CriticalSectionManager() {
		DeleteCriticalSection (&lock);
	}

	void EnterLock() {
		 EnterCriticalSection(&lock);
	}

	void LeaveLock() {
		LeaveCriticalSection(&lock);		
	}
};



}
